.

iT邦幫忙

2024 iThome 鐵人賽

DAY 10
0
Modern Web

web3 短篇集系列 第 10

以太坊客戶端跑起來

  • 分享至 

  • xImage
  •  

為了送一筆足夠隱私的交易,似乎需要自己跑節點才有辦法做到,若使用公共的節點,好像會洩露一些交易的內容?我不確定。我過去都是使用免費的公共節點,infura, alchemy, publicnode.com, 不然就是去chainlist.org 找,過去嘗試跑節點但最後都放棄,覺得太難而且不知道跑了有什麼好處。

今天就來紀錄跑節點的歷程,許多知識我只能先略過,因為我也不懂,透過 GenAI 的協助,只能邊跑邊學習了。

節點的軟體生態系與多樣性統計數據可以看這兩個網站:

概念介紹我是看這篇:如何跑起以太坊執行層與共識層客戶端,文中最後跑的執行層是 Nethermind,共識層是 Prysm。

我這次要跑的是 Geth 和 Lodestar,一樣不跑 Validator Client。這次要使用 GCP 免費三個月的方案,那我們開始吧!

建立 GCP 虛擬機

首先到 Google Cloud,找到 Compute Engine 的地方,按 CREATE INSTANCE 開始進入設定

設定名字,選擇地點台灣

預設是 E2 我選 N2

系統我選 Ubuntu 24.04 LTS x86/64,注意 Size 試用版最大開到 500 GB

防火牆我不是很懂,都打勾,IP forwarding 也打開

其他保持原樣,接下來設定 ssh,首先在本地產 key

ssh-keygen

我使用 MacOS,公鑰的位置預設在 cat .ssh/id_ed25519.pub

直接在中央上方欄搜尋 Metadata,選擇 SSH KEYS

然後貼上你的公鑰,這裡的 Username 要記住,配上左側 VM instances 找到 VM 看到欄位 External IP 記下來。

從本地 ssh 到 VM

ssh <username>@<external-ip>

成功進到 VM 後,開始建置環境,安裝 Nodejs 和一些必要的工具

sudo apt-get update

# nodejs
sudo apt install curl
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash
source ~/.bashrc
nvm install node
npm install -g yarn

sudo apt install build-essential

調整機器的時間

sudo timedatectl set-timezone Asia/Taipei
timedatectl

直接安裝 geth

sudo add-apt-repository -y ppa:ethereum/ethereum

sudo apt-get update
sudo apt-get install ethereum

下載與建立 lodestar

git clone -b stable https://github.com/chainsafe/lodestar.git
cd lodestar
yarn install
yarn run build

確認以下兩個指令跑得動!

geth -h | less

PS: less 的用法:空白鍵下一頁,b 是上一頁。

cd lodestar
./lodestar --help

建立節點

我要使用 sepolia 測試網,目標是透過 JSON RPC API 成功送一個交易,因此希望節點同步愈快愈好。

首先建立一個 JWT token 在 ~,這是為了讓 geth 與 lodestar 溝通用的

openssl rand -hex 32 | tr -d "\n" > "jwt.hex"

啟動 geth

geth --syncmode "snap" \
--authrpc.jwtsecret /home/me/jwt.hex \
--http --http.addr "0.0.0.0" --http.api net,eth,personal,web3,engine,admin \
--sepolia

--syncmode: 預設就是 snap 因此可略,另一個模式叫 full,會比較久。
--authrpc.jwtsecret: 指定 jwt token 的位置
--http: 開通 JSON RPC API
--http.addr "0.0.0.0": 設定任意 IP 都可以請求
--http.api: 要開通的 api,比較常用的應該是 eth
--sepolia: 測試網(推薦搭配賽波利雅之歌

啟動 lodestar

./lodestar beacon --network=sepolia \
--jwt-secret=/home/me/jwt.hex \
--checkpointSyncUrl=https://beaconstate-sepolia.chainsafe.io

--jwt-secret: 指定 jwt token 的位置
--checkpointSyncUrl: 以下說明

關於共識層的 checkpoint sync 我還不懂,好像會讓同步比較快因此就使用了,之後有機會再來補充相關知識,目前先提供參考資料:

補充:tmux 使用教學

為了確保 ssh 連線斷掉後 VM 能夠繼續運作兩個客戶端們,tmux 讓你可以在一個終端中管理多個會話。

tmux -h                        # 說明書
tmux                           # 開始 tmux
Control-B + D                  # 離開當前
tmux list                      # 列出
tmux a -t <number>             # attach session
Control-D                      # 離開並刪除當前 session
tmux kill-session -t <number>  # 刪除 session

JSON RPC API

使用 curl 呼叫 JSON RPC API

eth_syncing

curl -X POST http://107.167.177.201:8545 \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}'

eth_block

curl -X POST http://107.167.177.201:8545 \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'

PS: 可搭配 jq 讓 json output 更易讀

使用 Typescript 呼叫 JSON RPC API

下載 bun

sudo apt install unzip
curl -fsSL https://bun.sh/install | bash
mkdir ts
cd ts
bun init

eth_syncing

if (!process.env.RPC_URL) {
	throw new Error('Missing .env')
}

const response = await fetch(process.env.RPC_URL, {
	method: 'post',
	headers: {
		'Content-Type': 'application/json',
	},
	body: JSON.stringify({
		jsonrpc: '2.0',
		method: 'eth_syncing',
		params: [],
		id: 1,
	}),
})

console.log(await response.json())

一開始 geth 一直找不到 peer,導致資料遲遲無法開始下載,真的很傷腦筋。

所幸目前 state 跟 chain 都穩定持續下載中,預估再三個多小時,期待明天可以順利與之互動!


上一篇
自主管理的錢包
下一篇
認識 Storage Slots
系列文
web3 短篇集30
.
圖片
  直播研討會

尚未有邦友留言

立即登入留言